Skip to content

feat: chat ux improvements and mobile responsiveness fixes#150

Merged
Israeltheminer merged 8 commits into
mainfrom
update-ui
Jan 9, 2026
Merged

feat: chat ux improvements and mobile responsiveness fixes#150
Israeltheminer merged 8 commits into
mainfrom
update-ui

Conversation

@Israeltheminer
Copy link
Copy Markdown
Collaborator

@Israeltheminer Israeltheminer commented Jan 9, 2026

Summary by CodeRabbit

  • New Features

    • Double-click chat items to rename; single-click to open them
    • Automatic theme color adaptation for light and dark modes
  • Bug Fixes

    • Improved handling of streaming messages and optimistic message updates
  • Style

    • Responsive padding adjustments throughout chat interface
    • Rename button now hidden on mobile for cleaner layout
    • Enhanced dialog styling with rounded corners and responsive spacing
    • Improved header backdrop effect with better browser compatibility

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jan 9, 2026

📝 Walkthrough

Walkthrough

This PR modifies multiple components within the chat interface and theming system. Changes include responsive padding adjustments across chat pages and dialogs, a chat sidebar refactor introducing double-click-to-edit functionality with debouncing, optimistic message timestamp tracking for improved message clearing logic, delegation of cursor display control to the incremental markdown component, new theme color metadata management, backdrop filter optimization for Safari compatibility, and removal of the "Recent" label from chat history. The modifications span layout, styling, UI behavior, and streaming/markdown rendering paths.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • update chat response components #20: Modifies TypewriterText and streaming markdown cursor rendering paths that are refactored in this PR to use the new showCursor prop.
  • talecorp/poc#238: Updates ThinkingAnimation and streaming/loading conditions in chat-interface.tsx that overlap with the expanded rendering logic in this PR.
  • tale-project/poc2#416: Modifies optimistic message handling and chat-interface.tsx logic, directly related to the new optimisticMessageTimestampRef tracking added here.

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In
@services/platform/app/(app)/dashboard/[id]/chat/components/chat-history-sidebar.tsx:
- Around line 210-226: The button inside the chat-history-sidebar click handler
is missing an explicit type and will default to "submit", risking unwanted form
submissions; update the button element that uses clickTimeoutRef,
handleStartRename, and handleChatClick to include type="button" so it does not
submit any parent form.
- Line 42: The clickTimeoutRef timeout created in chat-history-sidebar.tsx
(clickTimeoutRef = useRef(...)) isn’t cleared on unmount; add a useEffect with a
cleanup that checks clickTimeoutRef.current and calls clearTimeout(...) (and
sets it to null) to avoid firing after the component unmounts, ensuring any
pending 250ms timeout is cancelled.

In
@services/platform/app/(app)/dashboard/[id]/chat/components/incremental-markdown.tsx:
- Around line 144-208: Hooks must be called unconditionally: move the useMemo
block that builds componentsWithCursor so it runs before the early return;
compute revealedContent safely (e.g. const revealedContent = content ?
content.slice(0, revealedLength) : '') before the hook so revealedContent.length
is available, then keep the early return if (!content) return null after the
useMemo (or change the early return to check for empty render result) so useMemo
(referenced by componentsWithCursor, showCursor, components, and the
CursorWrapper/createCursorWrapper logic that uses TypewriterCursor) is always
invoked in the same order on every render.
📜 Review details

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro (Legacy)

📥 Commits

Reviewing files that changed from the base of the PR and between a859349 and b1ede81.

📒 Files selected for processing (12)
  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-history-sidebar.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-interface.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/incremental-markdown.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/typewriter-text.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/page.tsx
  • services/platform/app/(app)/layout.tsx
  • services/platform/components/layout/sticky-header.tsx
  • services/platform/components/theme-color-meta.tsx
  • services/platform/components/ui/dialog/dialog.tsx
  • services/platform/messages/en.json
💤 Files with no reviewable changes (1)
  • services/platform/messages/en.json
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{tsx,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{tsx,jsx}: ALL pages should be optimized for accessibility (Level AA)
Do NOT hardcode text, use the translation hooks/functions instead for user-facing UI in React/Next.js
CONSIDER ALWAYS TO add optimistic updates with withOptimisticUpdate for useMutation in React/Next.js. If you decide to NOT add a optimistic update you need to provide a good reason why and comment the hook
CONSIDER ALWAYS TO use reusable components in React/Next.js
USE useMemo, useCallback and memo the right moment in React/Next.js
DO NOT overuse useEffect in React/Next.js
USE cva if a component has multiple variants in React/Next.js
AVOID router.refresh() in Next.js
AVOID CSR-only approaches, AVOID ssr: false, ALWAYS optimize for SSR in Next.js
CONSIDER using dynamic for large external packages BUT DO NOT over use it in Next.js
AVOID hydration issues (server-client mismatches) in Next.js
DO NOT use next/image. USE the custom Image component from @/components/ui/image instead
CONSIDER TO preload queries with preloadQuery and usePreloadedQuery in React with Convex
ALWAYS CONSIDER semantic HTML elements (<button>, <nav>, <main>, <header>, <footer>, <article>, <section>) for accessibility
ALWAYS provide text alternatives for non-text content (alt for images, aria-label for icon buttons) for accessibility
ENSURE all interactive elements are keyboard accessible and have visible focus states for accessibility
USE proper heading hierarchy (h1h2h3), never skip heading levels for accessibility
ALWAYS associate form labels with inputs using htmlFor or wrapping for accessibility
PROVIDE clear error messages that identify the field and describe how to fix the issue for accessibility
AVOID using color alone to convey information for accessibility
USE aria-live regions for dynamic content updates for accessibility

Files:

  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/components/theme-color-meta.tsx
  • services/platform/components/layout/sticky-header.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/page.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-history-sidebar.tsx
  • services/platform/app/(app)/layout.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-interface.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/typewriter-text.tsx
  • services/platform/components/ui/dialog/dialog.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/incremental-markdown.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: USE implicit typing whenever possible in TypeScript
DO NOT use type casting. Avoid any, and unknown whenever possible in TypeScript
ALWAYS put imports at the top and exports at the bottom. Keep them sorted correctly in TypeScript
PREFER named exports. AVOID default exports (only if needed) in TypeScript
PREFER export const/let, export function, export class etc. instead of export { ... } in TypeScript
PREFER export * from instead of export { ... } from in TypeScript
DO NOT export if not needed outside the module in TypeScript

Files:

  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/components/theme-color-meta.tsx
  • services/platform/components/layout/sticky-header.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/page.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-history-sidebar.tsx
  • services/platform/app/(app)/layout.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-interface.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/typewriter-text.tsx
  • services/platform/components/ui/dialog/dialog.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/incremental-markdown.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx
**/app/**/+(components|hooks|actions|utils)/**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Route-specific code (pages, layouts, and subfolders like components/, hooks/, actions/, utils/ should be scoped to that route in /app

Files:

  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-history-sidebar.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-interface.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/typewriter-text.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/incremental-markdown.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx
🧠 Learnings (37)
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace p-[8px] with p-2

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/components/ui/dialog/dialog.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace p-[4px] with p-1

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/components/ui/dialog/dialog.tsx
📚 Learning: 2025-11-25T04:37:44.394Z
Learnt from: CR
Repo: tale-project/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-11-25T04:37:44.394Z
Learning: Applies to **/*.{tsx,jsx} : Use semantic spacing classes when available: `p-1` for 4px, `p-2` for 8px, `m-1` for 4px, `m-2` for 8px

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/components/ui/dialog/dialog.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace m-[8px] with m-2

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/components/ui/dialog/dialog.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace m-[4px] with m-1

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace text-[14px] with text-sm

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/components/ui/dialog/dialog.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace text-[12px] with text-xs

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace text-[18px] with text-lg

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace text-[20px] with text-xl

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx
📚 Learning: 2025-11-25T04:37:44.394Z
Learnt from: CR
Repo: tale-project/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-11-25T04:37:44.394Z
Learning: Applies to **/*.{tsx,jsx} : Use standard font size classes instead of arbitrary values: `text-xs` for 12px, `text-sm` for 14px, `text-base` for 16px, `text-lg` for 18px, `text-xl` for 20px, `text-2xl` for 24px

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/components/ui/dialog/dialog.tsx
📚 Learning: 2025-12-26T02:23:20.245Z
Learnt from: larryro
Repo: tale-project/tale PR: 35
File: services/platform/app/(app)/dashboard/[id]/chat/components/integration-approval-card.tsx:58-90
Timestamp: 2025-12-26T02:23:20.245Z
Learning: In services/platform/app/(app)/dashboard/[id]/chat/components/integration-approval-card.tsx, prefer reading the approving user from the authenticated session context rather than passing a userId from the frontend. The hardcoded 'user' string can be acceptable only as a temporary placeholder during the initial implementation until a user profile feature is added; plan to replace with proper user identity via session context or user service once backend supports it.

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx
  • services/platform/components/theme-color-meta.tsx
  • services/platform/components/layout/sticky-header.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/page.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-history-sidebar.tsx
  • services/platform/app/(app)/layout.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-interface.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/typewriter-text.tsx
  • services/platform/components/ui/dialog/dialog.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/incremental-markdown.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Use semantic design-system colors for all text and backgrounds within tables

Applied to files:

  • services/platform/components/theme-color-meta.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Use bg-background for main backgrounds instead of bg-white

Applied to files:

  • services/platform/components/layout/sticky-header.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Use bg-muted for subtle backgrounds and hover states instead of bg-gray-100 or bg-gray-50

Applied to files:

  • services/platform/components/layout/sticky-header.tsx
📚 Learning: 2026-01-08T19:30:25.182Z
Learnt from: CR
Repo: tale-project/tale PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-08T19:30:25.182Z
Learning: Applies to **/*.{tsx,jsx} : USE `cva` if a component has multiple variants in React/Next.js

Applied to files:

  • services/platform/app/(app)/layout.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/typewriter-text.tsx
📚 Learning: 2026-01-08T19:30:25.182Z
Learnt from: CR
Repo: tale-project/tale PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-08T19:30:25.182Z
Learning: Applies to **/*.{tsx,jsx} : CONSIDER ALWAYS TO use reusable components in React/Next.js

Applied to files:

  • services/platform/app/(app)/layout.tsx
📚 Learning: 2025-08-21T14:59:36.874Z
Learnt from: CR
Repo: talecorp/lanserhof PR: 0
File: .cursorrules:0-0
Timestamp: 2025-08-21T14:59:36.874Z
Learning: Applies to {app,components}/**/*.{tsx,jsx} : Use Next.js Image component for all images

Applied to files:

  • services/platform/app/(app)/layout.tsx
📚 Learning: 2025-07-19T15:29:09.401Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursorrules:0-0
Timestamp: 2025-07-19T15:29:09.401Z
Learning: Applies to app/components/**/*.{js,jsx,ts,tsx} : Use Next.js Image component for all images.

Applied to files:

  • services/platform/app/(app)/layout.tsx
📚 Learning: 2026-01-08T19:30:25.182Z
Learnt from: CR
Repo: tale-project/tale PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-08T19:30:25.182Z
Learning: Applies to **/*.{tsx,jsx} : Do NOT hardcode text, use the translation hooks/functions instead for user-facing UI in React/Next.js

Applied to files:

  • services/platform/app/(app)/layout.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx
📚 Learning: 2026-01-08T19:30:25.182Z
Learnt from: CR
Repo: tale-project/tale PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-08T19:30:25.182Z
Learning: Applies to **/*.{tsx,jsx} : AVOID hydration issues (server-client mismatches) in Next.js

Applied to files:

  • services/platform/app/(app)/layout.tsx
📚 Learning: 2025-07-03T08:43:49.346Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursor/rules/next-best-practice.mdc:0-0
Timestamp: 2025-07-03T08:43:49.346Z
Learning: Applies to **/*.{tsx,jsx} : Use Next.js Image component for images

Applied to files:

  • services/platform/app/(app)/layout.tsx
📚 Learning: 2026-01-08T19:30:25.182Z
Learnt from: CR
Repo: tale-project/tale PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-08T19:30:25.182Z
Learning: Applies to **/*.{tsx,jsx} : AVOID CSR-only approaches, AVOID ssr: false, ALWAYS optimize for SSR in Next.js

Applied to files:

  • services/platform/app/(app)/layout.tsx
📚 Learning: 2025-10-11T11:46:02.452Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursorrules:0-0
Timestamp: 2025-10-11T11:46:02.452Z
Learning: Applies to **/*.{tsx,jsx} : Use Next.js Image component for all images instead of <img>

Applied to files:

  • services/platform/app/(app)/layout.tsx
📚 Learning: 2024-10-12T10:20:33.353Z
Learnt from: yannickmonney
Repo: talecorp/tale PR: 1320
File: core/next/src/utils/next/metadata/generate-default-metadata.ts:3-3
Timestamp: 2024-10-12T10:20:33.353Z
Learning: In the TypeScript file `core/next/src/utils/next/metadata/generate-default-metadata.ts`, the import path `'tale/core/base/utils/utils/i18n/get-global-translate'` with the duplicated `'utils'` segment is intentional and correct. This is the proper import path for the `getGlobalTranslate` function and should not be flagged as a typo in future code reviews.

Applied to files:

  • services/platform/app/(app)/layout.tsx
📚 Learning: 2026-01-08T19:30:25.182Z
Learnt from: CR
Repo: tale-project/tale PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-08T19:30:25.182Z
Learning: Applies to **/*.{tsx,jsx} : CONSIDER ALWAYS TO add optimistic updates with `withOptimisticUpdate` for `useMutation` in React/Next.js. If you decide to NOT add a optimistic update you need to provide a good reason why and comment the hook

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-interface.tsx
📚 Learning: 2025-12-20T13:38:13.773Z
Learnt from: larryro
Repo: tale-project/tale PR: 30
File: services/platform/convex/model/chat_agent/chat_with_agent.ts:130-144
Timestamp: 2025-12-20T13:38:13.773Z
Learning: In services/platform/convex/model/chat_agent/chat_with_agent.ts, image fileIds are intentionally displayed as `*(fileId: ${attachment.fileId})*` in the markdown because the AI needs to reference them from thread history for re-analysis using the image tool. This is a business/developer tool, not consumer-facing, so technical metadata visibility is acceptable.

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-interface.tsx
📚 Learning: 2026-01-08T19:30:25.182Z
Learnt from: CR
Repo: tale-project/tale PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-08T19:30:25.182Z
Learning: Applies to **/*.{tsx,jsx} : USE `aria-live` regions for dynamic content updates for accessibility

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-interface.tsx
📚 Learning: 2026-01-08T19:30:25.182Z
Learnt from: CR
Repo: tale-project/tale PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-08T19:30:25.182Z
Learning: Applies to **/*.{tsx,jsx} : USE `useMemo`, `useCallback` and `memo` the right moment in React/Next.js

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/components/typewriter-text.tsx
📚 Learning: 2025-07-03T08:43:49.346Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursor/rules/next-best-practice.mdc:0-0
Timestamp: 2025-07-03T08:43:49.346Z
Learning: Applies to **/*.{tsx,jsx} : Consistent component structure: hooks, effects, event handlers, render

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/components/typewriter-text.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/incremental-markdown.tsx
📚 Learning: 2025-07-19T15:29:09.401Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursorrules:0-0
Timestamp: 2025-07-19T15:29:09.401Z
Learning: Applies to app/components/**/*.{js,jsx,ts,tsx} : Use React.memo for expensive components to optimize performance.

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/components/typewriter-text.tsx
📚 Learning: 2025-07-03T08:43:49.346Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursor/rules/next-best-practice.mdc:0-0
Timestamp: 2025-07-03T08:43:49.346Z
Learning: Applies to **/*.{tsx,jsx} : Use React.memo for expensive components

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/components/typewriter-text.tsx
📚 Learning: 2025-07-19T15:30:00.886Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursor/rules/core-rules.mdc:0-0
Timestamp: 2025-07-19T15:30:00.886Z
Learning: Applies to **/*.{tsx,jsx} : Use memoization (e.g., useMemo) for expensive operations and cache repeated calculations (e.g., useRef with Map) in React components

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/components/typewriter-text.tsx
📚 Learning: 2025-11-30T12:29:39.745Z
Learnt from: CR
Repo: tale-project/poc2 PR: 0
File: .cursor/rules/workspace_rules.mdc:0-0
Timestamp: 2025-11-30T12:29:39.745Z
Learning: Applies to **/*.{tsx,jsx} : Use `React.memo` for expensive components

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/components/typewriter-text.tsx
📚 Learning: 2025-10-01T17:12:39.508Z
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Replace text-[24px] with text-2xl

Applied to files:

  • services/platform/components/ui/dialog/dialog.tsx
  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx
📚 Learning: 2025-08-21T15:01:09.405Z
Learnt from: CR
Repo: talecorp/lanserhof PR: 0
File: .cursor/rules/core-rules.mdc:0-0
Timestamp: 2025-08-21T15:01:09.405Z
Learning: Applies to **/*.{tsx} : Define a Props interface/type and use it in the exported component signature

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/components/incremental-markdown.tsx
📚 Learning: 2025-08-21T15:01:09.405Z
Learnt from: CR
Repo: talecorp/lanserhof PR: 0
File: .cursor/rules/core-rules.mdc:0-0
Timestamp: 2025-08-21T15:01:09.405Z
Learning: Applies to **/*.{tsx,jsx} : Follow component structure: Hooks, Effects, Event handlers, then Render

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/components/incremental-markdown.tsx
📚 Learning: 2025-07-20T08:40:24.693Z
Learnt from: CR
Repo: talecorp/poc PR: 0
File: .cursor/rules/ai.mdc:0-0
Timestamp: 2025-07-20T08:40:24.693Z
Learning: Applies to **/actions/*.ts : For text generation, use the `generateObject` or similar functions from the AI SDK

Applied to files:

  • services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx
🧬 Code graph analysis (3)
services/platform/app/(app)/dashboard/[id]/chat/components/chat-history-sidebar.tsx (1)
services/platform/components/ui/input.tsx (1)
  • Input (35-141)
services/platform/app/(app)/layout.tsx (1)
services/platform/components/theme-color-meta.tsx (1)
  • ThemeColorMeta (11-36)
services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx (2)
services/platform/components/ui/button.tsx (1)
  • Button (56-95)
services/platform/components/ui/tooltip.tsx (2)
  • TooltipTrigger (22-22)
  • TooltipContent (24-37)
🪛 Biome (2.1.2)
services/platform/app/(app)/dashboard/[id]/chat/components/chat-history-sidebar.tsx

[error] 210-224: Provide an explicit type prop for the button element.

The default type of a button is submit, which causes the submission of a form when placed inside a form element. This is likely not the behaviour that you want inside a React application.
Allowed button types are: submit, button or reset

(lint/a11y/useButtonType)

services/platform/app/(app)/dashboard/[id]/chat/components/incremental-markdown.tsx

[error] 152-152: This hook is being called conditionally, but all hooks must be called in the exact same order in every component render.

Hooks should not be called after an early return.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build Docker Image
🔇 Additional comments (15)
services/platform/app/(app)/dashboard/[id]/chat/components/chat-actions.tsx (1)

76-88: LGTM! Responsive visibility and tooltip rendering improvements.

The rename button is appropriately hidden on mobile (hidden md:inline-flex), and the tooltip content rendering as children is consistent with the TooltipContent component API shown in the relevant snippets. Accessibility is preserved with aria-label.

services/platform/components/ui/dialog/dialog.tsx (1)

114-119: LGTM! Mobile-responsive padding with consistent top spacing.

The responsive padding (p-4 sm:p-6) with the always-applied pt-5 maintains consistent header spacing for the close button positioning while reducing horizontal/bottom padding on mobile. The rounded-2xl is now always applied instead of only at sm: breakpoint, improving mobile appearance.

services/platform/app/(app)/dashboard/[id]/chat/components/chat-interface.tsx (2)

489-525: LGTM! Improved optimistic message clearing with timestamp tracking.

The timestamp-based approach prevents incorrectly clearing the optimistic message when older messages with matching content exist in the thread. The 500ms buffer (searchStartTime = optimisticMessageTimestampRef.current - 500) appropriately accounts for timing differences between client submission and server message creation. The ref is correctly reset when the optimistic message is cleared.


828-830: LGTM! Edge case handling for streaming without initial text.

The added condition (streamingMessage && !streamingMessage.text) correctly handles the scenario where streaming has started but no text content has arrived yet, preventing a visual gap between the user message and the AI response area.

services/platform/app/(app)/dashboard/[id]/chat/components/chat-history-sidebar.tsx (1)

184-207: Consider accessibility impact of the 0.9 scale transform on the editing input.

The transform: matrix(0.9, 0, 0, 0.9, 0, 0) scales the input to 90%, which reduces text size and may impact readability for users with visual impairments. If this is for visual alignment, consider using padding or margin adjustments instead, or ensure the scaled text still meets WCAG minimum font size guidelines.

services/platform/app/(app)/dashboard/[id]/chat/page.tsx (1)

48-48: LGTM! Skeleton padding matches actual component.

The responsive padding change (p-4 sm:p-8) is consistent with the same change in chat-interface.tsx, ensuring the skeleton accurately represents the actual layout during loading.

services/platform/app/(app)/dashboard/[id]/chat/[threadId]/page.tsx (1)

48-48: LGTM! Consistent responsive padding across chat skeletons.

The padding change aligns with the same updates in chat/page.tsx and chat-interface.tsx, maintaining visual consistency between loading and loaded states.

services/platform/components/layout/sticky-header.tsx (1)

17-26: LGTM! Safari-compatible backdrop blur implementation.

The inline style approach with both WebkitBackdropFilter (for Safari) and backdropFilter (for other browsers) ensures cross-browser compatibility. The blur value (12px) maintains visual parity with the previous Tailwind backdrop-blur-md class. Good documentation of the reasoning in the JSDoc.

services/platform/app/(app)/dashboard/[id]/chat/components/typewriter-text.tsx (1)

158-179: LGTM! Clean delegation of cursor rendering to IncrementalMarkdown.

The refactor properly moves cursor display responsibility to the markdown renderer while maintaining clear logic for when to show the cursor. The showCursor condition correctly gates on all three states: streaming active, typing in progress, and text present.

services/platform/components/theme-color-meta.tsx (2)

11-36: Good use of the mounted pattern for hydration safety.

The two-effect approach correctly prevents SSR/client mismatch when using useTheme() from next-themes. The DOM manipulation for the meta tag is appropriate since React cannot dynamically update meta tags in the document head.


6-9: Color constants are duplicated across files.

The THEME_COLORS values (#fcfcfc and #09090b) are duplicated in layout.tsx within the viewport export. This creates a maintenance risk where changes to theme colors could be applied inconsistently.

Consider extracting these to a shared constant:

♻️ Suggested refactor
// In a shared location, e.g., @/lib/constants/theme.ts
export const THEME_COLORS = {
  light: '#fcfcfc',
  dark: '#09090b',
} as const;

Then import and use in both files.

⛔ Skipped due to learnings
Learnt from: CR
Repo: tale-project/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-11-25T04:37:44.394Z
Learning: Applies to **/*.{tsx,jsx} : NEVER use hardcoded colors like `text-gray-500`, `bg-gray-100`, `border-gray-200`; ALWAYS use design system semantic colors: `text-foreground` for primary text, `text-muted-foreground` for secondary text, `bg-background` for main backgrounds, `bg-muted` for subtle backgrounds and hover states, `border-border` for borders
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Never use hardcoded Tailwind gray/black/white color utilities (e.g., text-gray-500, bg-gray-100, border-gray-200, text-black)
Learnt from: CR
Repo: tale-project/tale PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-08T19:30:25.182Z
Learning: Applies to **/*.{tsx,jsx} : AVOID using color alone to convey information for accessibility
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Use semantic design-system colors for all text and backgrounds within tables
Learnt from: larryro
Repo: tale-project/tale PR: 18
File: services/platform/convex/agent_tools/convex_tools/workflows/update_workflow_step_tool.ts:20-21
Timestamp: 2025-12-15T14:43:53.478Z
Learning: In the tale-project/tale repository, when constants are duplicated between files (e.g., validStepTypes in update_workflow_step_tool.ts and validate_step_config.ts), the preference is to maintain self-contained file structure with sync comments documenting the relationship, rather than importing shared constants. This approach prioritizes clear, self-contained structure over strict DRY principles.
Learnt from: CR
Repo: tale-project/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-11-25T04:37:44.394Z
Learning: Applies to **/*.{tsx,jsx} : ALWAYS use the Table component (`Table`, `TableHeader`, `TableBody`, `TableRow`, `TableHead`, `TableCell`) instead of custom flex layouts; apply proper column widths using rem units and use semantic colors for all text and backgrounds
Learnt from: CR
Repo: talecorp/poc2 PR: 0
File: .cursor/rules/figma_rules.mdc:0-0
Timestamp: 2025-10-01T17:12:39.508Z
Learning: Applies to **/*.tsx : Use text-foreground for primary text instead of text-gray-950 or text-black
Learnt from: yannickmonney
Repo: talecorp/tale PR: 1320
File: core/next/src/utils/next/metadata/generate-default-metadata.ts:3-3
Timestamp: 2024-10-12T10:20:33.353Z
Learning: In the TypeScript file `core/next/src/utils/next/metadata/generate-default-metadata.ts`, the import path `'tale/core/base/utils/utils/i18n/get-global-translate'` with the duplicated `'utils'` segment is intentional and correct. This is the proper import path for the `getGlobalTranslate` function and should not be flagged as a typo in future code reviews.
services/platform/app/(app)/layout.tsx (2)

20-25: Good use of Next.js viewport export for initial theme colors.

The viewport export provides the initial theme-color meta tags with media queries, which is the correct SSR approach. Combined with ThemeColorMeta for dynamic updates after hydration, this provides a complete solution for theme color management.

As noted in the theme-color-meta.tsx review, consider extracting the color values to avoid duplication.


83-83: Correct placement inside ThemeProvider.

ThemeColorMeta is appropriately positioned within ThemeProvider to access the theme context via useTheme().

services/platform/app/(app)/dashboard/[id]/chat/components/incremental-markdown.tsx (2)

114-125: LGTM! Well-implemented cursor component.

Good accessibility practice with aria-hidden="true" to prevent screen readers from announcing the decorative cursor element.


236-243: LGTM! Memo comparison correctly includes showCursor.

The updated comparison function properly triggers re-renders when cursor visibility changes, ensuring the cursor appears/disappears correctly during streaming.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant